import {
  vnode
} from "snabbdom";
/**
 * 产生虚拟DOM树，返回的一个对象
 * 低配版本的h函数，这个函数必须接受三个参数，缺一不可
 * @param {*} sel
 * @param {*} data
 * @param {*} c
 * 调用只有三种形态 文字、数组、h函数
 * ① h('div', {}, '文字')
 * ② h('div', {}, [])
 * ③ h('div', {}, h())
 */
export default function h(sel, data, c) {
  // 检查参数个数
  if (arguments.length != 3) throw new Error('对不起，h函数必须传入3个参数，我们是低配版的h函数！');
  // 检查参数c的类型
  if (typeof c == 'string' || typeof c == 'number') {
    return vnode(sel, data, undefined, c, undefined)
  } else if (Array.isArray(c)) {
    // console.log('数组：', c)
    let children = [];
    for (let i = 0; i < c.length; i++) {
      // 检查c[i]必须是一个对象,
      if (!typeof c[i] == 'object' && c[i].hasOwnProperty('sel')) {
        throw new Error('传入的数组参数中有项不是h函数')
      }
      // 这里不用执行c[i]，因为你的测试语句中已经有了执行
      // 此时只需要收集就可以了
      children.push(c[i]);
    }
    // 循环结束了，就说明childrens收集完毕了，此时可以返回虚拟节点，它有children属性的
    return vnode(sel, data, children, undefined, undefined)
  } else if (typeof c == 'object' && c.hasOwnProperty('sel')) {
    // 即，传入的c是唯一的chilren
    let children = [c];
    return vnode(sel, data, children, undefined, undefined)
  } else {
    throw new Error('传入的三个参数类型不对！')
  }
}